home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / gfa / gfacode.arc / FORMAT.LST < prev    next >
Encoding:
File List  |  1990-11-14  |  4.6 KB  |  119 lines

  1. '  How to format a disk without reinventing the wheel.
  2. '
  3. '  Procedure calling example.  Formats drive B: with one side,
  4. '  giving it the name HELLO.DIS.
  5. '
  6. format(1,1,"HELLO.DIS")
  7. END
  8. '
  9. '  And now, the actual procedure. . .
  10. '
  11. PROCEDURE format(drive%,maxside%,diskname$)
  12.   '
  13.   '  Floppy disk formatting code for GFA BASIC 3.0
  14.   '  (modified from MichTron Disk Format code)
  15.   '
  16.   '  Parameters:
  17.   '  drive%    -- disk drive number (0=A:, 1=B:)
  18.   '  maxside%  -- sides to format (1 or 2)
  19.   '  diskname$ -- disk volume name
  20.   '
  21.   '  Error checking for drive number
  22.   IF drive%=0 OR drive%=1
  23.     '  Error checking for number of sides
  24.     IF maxside%=1 OR maxside%=2
  25.       '  NOTE:  Error checking is not provided here for diskname$.
  26.       '  It can be any valid filename ("12345678.123") or a
  27.       '  null string ("")
  28.       '
  29.       '  And now for the formatting variables.
  30.       '  Play around with them. if you dare,
  31.       '  but be carefull!
  32.       '
  33.       maxtrack%=80  !  Number of tracks to format: 80
  34.       maxsector%=9  !  Number of sectors per track: 9
  35.       interleave%=1 !  Interleave factor: 1
  36.       '                change to 11 for 'twisted' format
  37.       secdir%=7     !  Number of sectors for directory: 7
  38.       secfat%=5     !  Number of sectors for FAT: 5
  39.       '                change to 3 for IBM compatible format
  40.       cntfat%=2     !  Number of FATs: 2
  41.       spc%=2        !  Sectors per cluster: 2
  42.       media%=249    !  Medium description (whatever that means): 249
  43.       '
  44.       buffer$=SPACE$(10000)  !  Set up a buffer
  45.       buffer%=VARPTR(buffer$)  !  and a pointer to it
  46.       abort&=FALSE             !  Abort flag
  47.       '  Format sides
  48.       FOR i%=0 TO maxside%-1
  49.         IF abort&=FALSE
  50.           error%=XBIOS(10,L:buffer%,L:0,drive%,maxsector%,0,i%,interleave%,L:&H87654321,0)
  51.         ENDIF
  52.         IF error%
  53.           abort&=TRUE
  54.         ENDIF
  55.       NEXT i%
  56.       '  Format tracks
  57.       FOR i%=1 TO maxtrack%-1
  58.         FOR j%=0 TO maxside%-1
  59.           IF abort&=FALSE
  60.             error%=XBIOS(10,L:buffer%,L:0,drive%,maxsector%,i%,j%,interleave%,L:&H87654321,&HE5E5)
  61.             '  Display what's going on to the user
  62.             PRINT AT(1,1);"Track: "+STR$(i%)+" Side: "+STR$(j%)
  63.           ENDIF
  64.           IF error%
  65.             abort&=TRUE
  66.           ENDIF
  67.         NEXT j%
  68.       NEXT i%
  69.       IF abort&=FALSE  !  If there's been no error
  70.         '  Determine type of disk for boot sector
  71.         '  0 = one side, 40 tracks   (stone-age)
  72.         '  1 = two sides, 40 tracks  (likewise)
  73.         '  2 = one side, 80 tracks
  74.         '  3 = two sides, 80 tracks
  75.         type%=0
  76.         IF maxtrack%>70  !  High density
  77.           ADD type%,2
  78.         ENDIF
  79.         IF maxside%=2
  80.           ADD type%,1
  81.         ENDIF
  82.         ~XBIOS(18,L:buffer%,L:0,type%,0)  !  Create boot sector
  83.         length%=maxtrack%*maxsector%*maxside%
  84.         '  Adjust boot sector
  85.         POKE buffer%+13,spc%  !  Sectors per cluster
  86.         POKE buffer%+16,cntfat%  !  Number of FATs
  87.         POKE buffer%+17,(secdir%*16) AND &HFF  !  Number of possible directory
  88.         POKE buffer%+18,(secdir%*16)/256  !  entries (in low byte-high byte format)
  89.         POKE buffer%+19,(length%) AND &HFF  !  Number of sectors on disk
  90.         POKE buffer%+20,(length%)/256       !  (low byte-high byte format, again)
  91.         POKE buffer%+21,media%  !  Medium description, whatever that is
  92.         POKE buffer%+22,(secfat%) AND &HFF  !  Sectors per FAT
  93.         POKE buffer%+23,(secfat%)/256       !  (low byte-high byte)
  94.         POKE buffer%+24,(maxsector%) AND &HFF  !  Sectors per track
  95.         POKE buffer%+25,(maxsector%)/256       !  (you guessed it)
  96.         ~XBIOS(9,L:buffer%,L:0,drive%,1,0,0,1)  !  Write adjusted boot sector
  97.         '  Build a FAT, somehow, then write it
  98.         buffer$=CHR$(media%)+CHR$(255)+CHR$(255)+STRING$(509,0)
  99.         FOR i%=0 TO cntfat%-1
  100.           ~BIOS(4,3,L:VARPTR(buffer$),1,i%*secfat%+1,drive% AND 1)
  101.         NEXT i%
  102.         '  Build the disk volume name
  103.         volnam$=CHR$(drive%+65)+":\"+diskname$+CHR$(0)
  104.         handle%=GEMDOS(&H3C,L:VARPTR(volnam$),8)  !  Write disk name
  105.         ~GEMDOS(&H3E,handle%)
  106.         bytes%=DFREE(drive%+1)
  107.         ALERT 1,"Format completed.|"+STR$(bytes%)+" bytes available.",1," OK ",dum%
  108.       ELSE
  109.         '  Time for some error messages
  110.         ALERT 1,"Formatting error",1," Abort ",dum%  !  Generic "can't format"
  111.       ENDIF                                          !  error
  112.     ELSE
  113.       ALERT 1,"Error:|Incorrect number of sides",1," Abort ",dum%
  114.     ENDIF
  115.   ELSE
  116.     ALERT 1,"Error:|Incorrect drive specified",1," Abort ",dum%
  117.   ENDIF
  118. RETURN
  119.